/*
 * @Author: atao
 * @Date: 2023-11-14 15:07:13
 * @LastEditTime: 2023-12-06 15:39:50
 * @FilePath: \yayun-web000\src\apis\ajax.js
 */
/**
 * @description 封装axios
 * */
import { JOIN_STR_CACHE, TOKEN_CACHE } from "@/config/common.config";
import { DINGXIANG_BASE_URL, otherServiceUrls, noTokenUrls } from "@/config/url.config";
import { decodeApi, encodeApi } from "@/utils";
import axios from "axios";
/**
 * 1.实现通用数据配置 --baseURL\timeout
 * 2、实现拦截  -- a、请求前拦截，实现token注入；b、对于需要使用token的接口判断token是否存在--没有这个数据或者已经过期；c、不同服务器代理改变
 * 3、实现响应拦截--a、token过期，需要提示用户去登录；b、实现无感刷新token
 * 4、对axios进一步封装，支持async+await，简化用户调用接口的参数复杂性
 */
//创建axios实例
const Axios = axios.create({
    baseURL: DINGXIANG_BASE_URL,
    timeout: 5000,//超时设置,
})
//请求拦截
Axios.interceptors.request.use(config => {
    
    /**
     * 遍历服务器列表，判断是否要切换服务器代理关键字
     */
    for (let key in otherServiceUrls) {
        let val = otherServiceUrls[key]
        if (val.includes(config.url)) {
            config.baseURL = key;
            break;
        }
    }

    /**
  * 有的接口需要校验token，有些接口不需要
  */
    if (noTokenUrls.includes(config.url)) {
        return config
    }

    //获取缓存token数据，校验时效性
    let token = sessionStorage.getItem(TOKEN_CACHE);
    if (!token) {
        return Promise.reject({ code: 409, message: '您还没有登陆' })

    }
    //拦截的时效性
    let str = decodeApi(token).split(JOIN_STR_CACHE)
    if (str.length !== 2) {
        return Promise.reject({ code: 409, message: '您还没有登陆' })
    }
    if (Date.now() - str[1] > 1000 * 60 * 60 * 2) {
        return Promise.reject({ code: 409, message: '您还没有登陆' })
    }
    config.headers["X-token"] = str[0]
    config.headers["tt"] = Date.now()
    return config
})

/**无感续期token */
Axios.interceptors.response.use(rep=>{
    if(!rep.config||!rep.data){
        return rep
    }
    /**如果不需要token的接口的响应，不要去做token续期 */
    if(noTokenUrls.includes(rep.config.url)){
        return rep
    }else{
        /**如果请求是成功的，那么需要做token续期 */
        if(rep.data.code===200){
            let token=sessionStorage.getItem(TOKEN_CACHE)
            if(!!token){
                let str = decodeApi(token).split(JOIN_STR_CACHE)
                sessionStorage.setItem(TOKEN_CACHE, encodeApi(str[0] + JOIN_STR_CACHE + Date.now()))
            }
        }
        return rep;
    }
})
/**
 * 异步请求方法
 * @param {{url:string,method:"GET"|"POST"|"PUT"|"DELETE",params:any,data:any}} req 
 * @returns 
 */
export default function ajax(req) {
    if (typeof req === "string") {
        req = { url: req }
    }
    return new Promise(resolve => {
        Axios.request({
            url: req.url,
            method: req.method || "GET",
            // data: { ...req.data ,
            //     t: Date.now()
            // } || { t: Date.now() },
            data: req.data,
            params: {
                ...req.params,
                t: Date.now()
            } || { t: Date.now() },
            //  params: req.params,
        }).then(({ data }) => {
            resolve(data)
        }).catch(e => {
            resolve(e)
        })
    })
}